# -*-coding utf-8 -*-

__project__ = 'le-bo16'
__file_name__ = 'class9'
__author__ = 'hqDu'
__time__ = '2020-11-16 20:33'
__product_name = 'PyCharm'
# @fileName :class9.py

# 拆包、交换
# 拆包：把一个列表/元组/字典/函数（的返回结果）的内容拆成多个
# 注意，要拆的数据的个数要与变量的个数是一致的；字典拆包获得的是key
#  更方便变量的是什么内容，前提是已经知道内容是啥
my_list = ['haha','heihei']
# 方法1：下标，能得到值，不实用
# my_list[0]

# 方法2：拆包
# my_haha, my_heihei = my_list
# print(my_haha)

#

# # 函数拆包
# def my_func(name, age):
#     return '姓名' + name, '年龄'+ age
# # return 可以返回多个以逗号分隔开的数据
#
# print(my_func('lebo', '18'))
# my_name, my_age = my_func('lebo', '18')
# print(my_name)
# print(my_age)

# a, b, c = 1, 2, 3  # 同时进行赋值，一一对应


# 交换
# 方法1
# a = 4
# b = 5
# c = 0
#
# c = a
# a = b
# b = c
# print(a, b, c)

# 方法2：
# a = 4
# b = 5
# a = a + b
# b = a - b
# a = a - b
# print(a, b)

# 方法3：
# a = 4
# b = 5
# a, b = b, a
# print(a, b)
# print(id(a))
# print(id(b))

# 引用
# python，值靠引用传递
# 用id()来判断两个变量是否引用同一个值，id可以理解为那块内存的地址标示
# id是十六进制的

# 可以通过数据类型进行操作之后，id是否发生变化；id不变，可变数据类型，反之不可变数据类型
# 列表与字符串的区别：
# a = 'asd'
# b = a.title()
# print(b)
# print(id(a))
# print(id(b))
# # 对字符串操作之后，id发生变化，所以字符串是不可变数据类型
#
# a = ['a', 'b']
# print(id(a))
# a.append('c')
# print(id(a))
# 对列表操作之后，id不变，所以列表是可变数据类型

# 小数的精准计算
# 计算机内部是以二进制进行计算的，把二进制的数变为十进制的精准计算

# 这是由于底层CPU和IEEE754标准通过自己的浮点单位去执行算术时的特征
# 看似有穷的小数，在计算机二进制表示里却是无穷的

# 一般情况下，这一点点的小误差是允许存在的
# 但是金融领域是不能容忍这种误差的，那么就要考虑解决
# a = 4.2
# b = 1.0
# print(a+b)

from decimal import Decimal
from decimal import getcontext
print(Decimal('4.20') * Decimal('2.10'))

getcontext().prec = 7  # 设置精度，从整数位算起
x = 5.20
y = 2.10
z = Decimal(x) * Decimal(y)
print(z)

# 方法1  不是四舍五入
print('%.2f' %  (2.10 * 4.20))
f = 0.625
print('%.2f' % f)  # 结果：0.62

# 方法2  四舍五入
print('{:.3f}'.format(2.10 * 4.20))
print('{:.3f} {:.2f}'.format(87.9239,6723.111))
# 方法3 round()

# 学生管理系统


# 递归调用
# def my_func(num):
#     if num > 1:
#         return num * my_func(num-1)
#     else:
#         return 1
#
# print(my_func(5))